Utilisateur:Chphe/SuiviCat.js
Apparence
Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.
Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;
Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5./**
* Présentation : [[:fr:Utilisateur:Chphe/SuiviCat]]
* Auteur : Chphe
* {{Catégorisation JS|SuiviCat}}
*/
//////////////////////ZONE PERSONNALISABLE//////////////////////
var suivicat_cat = "Cat(%C3%A9|é)gorie"; // selon la langue de l'interface (fr -> Catégorie = Cat%C3%A9gorie ; Catégorie pour IE 6)
var suivicat_tab_aff_sv = ["actu", "préc", "raz", "indef"];
var suivicat_tab_aff_types = {"pages":"p", "subcats":"sc", "files":"f", "size": "t"};
/////////////////FIN DE LA ZONE PERSONNALISABLE/////////////////
var suivicat_server = window.location.hostname;
var suivicat_tab_types = ["pages", "subcats", "files"]; //et "size"
var suivicat_estIE;
var suivicat_div_sauveg_IE;
var suivicat_compteur;
var suivicat_tableau;
var suivicat_dateActu;
var suivicat_datePred;
var suivicat_div_liste;
function suivicat_initialiserLireVal()
{
if(suivicat_estIE) suivicat_div_sauveg_IE.load("sc_sauveg_IE");
}
function suivicat_finaliserEcrireVal()
{
if(suivicat_estIE) suivicat_div_sauveg_IE.save("sc_sauveg_IE");
}
function suivicat_lireVal(nom)
{
var res;
if(typeof globalStorage != "undefined") //FF
{
res = globalStorage[suivicat_server].getItem(nom);
}
else if(typeof window.localStorage != "undefined")
{
res = window.localStorage.getItem(nom);
}
else if(suivicat_estIE) //IE
{
res = suivicat_div_sauveg_IE.getAttribute(nom.replace(/\s/g, "_").replace(/%/g, "P"));
}
if(res) return res+""; // pour éviter retour par référence
else return null;
}
function suivicat_ecrireVal(nom, val)
{
if(typeof globalStorage != "undefined") //FF
{
globalStorage[suivicat_server].setItem(nom, val);
}
else if(typeof window.localStorage != "undefined")
{
window.localStorage.setItem(nom, val);
}
else if(suivicat_estIE) //IE
{
if(val) suivicat_div_sauveg_IE.setAttribute(nom.replace(/\s/g, "_").replace(/%/g, "P"), val);
else suivicat_div_sauveg_IE.removeAttribute(nom.replace(/\s/g, "_").replace(/%/g, "P"));
}
}
function suivicat_concatNb(ligneTab, suff) // jamais utilisé avec le suffixe "_ds"
{
var conc = ligneTab["pages"+suff]+"|"+ligneTab["subcats"+suff]+"|"+ligneTab["files"+suff]+"|"+ligneTab["size"+suff]+"|";
if(suff == "_pr") return conc+suivicat_datePred;
else return conc+suivicat_dateActu;
}
function suivicat_deconcatNb(ligneTab, suff, chaine)
{
var tab = chaine.split("|");
ligneTab["pages"+suff] = tab[0];
ligneTab["subcats"+suff] = tab[1];
ligneTab["files"+suff] = tab[2];
ligneTab["size"+suff] = tab[3];
if(suff == "_ds") ligneTab.date_ds = tab[4];
}
function suivicat_affichageVal(val)
{
if(val>0)
{
var ts2 = document.createElement("span");
ts2.className='mw-plusminus-pos';
ts2.innerHTML = "+"+val;
return ts2;
}else if(val<0)
{
var ts2 = document.createElement("span");
ts2.className='mw-plusminus-neg';
ts2.innerHTML = val;
return ts2;
}else
{
var texte_0 = document.createElement("small");
texte_0.innerHTML = "0";
return texte_0;
}
}
function suivicat_majCase(laCase, ligneTableau, type)
{
if(ligneTableau.cptOuDet == "cpt")
{
var nbActu = ligneTableau[type];
var nbPred = ligneTableau[type+"_pr"];
var nbDerS = ligneTableau[type+"_ds"];
laCase.innerHTML += " - <b>"+suivicat_tab_aff_types[type]+"</b> : "+nbActu;
laCase.appendChild(document.createTextNode(" : "));
if(nbPred)
{
var diff = parseInt(nbActu)-parseInt(nbPred);
laCase.appendChild(suivicat_affichageVal(diff));
}
else
{
laCase.appendChild(document.createTextNode("."));
}
laCase.appendChild(document.createTextNode(" / "));
if(nbDerS)
{
var diff = parseInt(nbActu)-parseInt(nbDerS);
laCase.appendChild(suivicat_affichageVal(diff));
}
else
{
laCase.appendChild(document.createTextNode("."));
}
}else
{
laCase.appendChild(document.createTextNode(" - "));
var b = document.createElement("b");
b.innerHTML = suivicat_tab_aff_types[type];
laCase.appendChild(b);
if(type != "size")
laCase.appendChild(document.createTextNode(" : "+ligneTableau["tabMem"+type].length));
else
laCase.appendChild(document.createTextNode(" : "+(ligneTableau.tabMempages.length+ligneTableau.tabMemsubcats.length+ligneTableau.tabMemfiles.length)));
if( (type != "size" && ligneTableau["memEnPlus"+type]) || (type == "size" && ligneTableau.memEnPluspages) )
{
laCase.appendChild(document.createTextNode(" : "));
var lien_aff = document.createElement("a");
lien_aff.style.color = "black";
lien_aff.href = "javascript:;";
lien_aff.onclick = function(){ suivicat_afficherDiffMembres(ligneTableau, type);}
laCase.appendChild(lien_aff);
var np;
if(type != "size") np = ligneTableau["memEnPlus"+type].length;
else np = ligneTableau.memEnPluspages.length + ligneTableau.memEnPlussubcats.length + ligneTableau.memEnPlusfiles.length;
if(type != "size") nm = ligneTableau["memEnMoins"+type].length;
else nm = ligneTableau.memEnMoinspages.length + ligneTableau.memEnMoinssubcats.length + ligneTableau.memEnMoinsfiles.length;
lien_aff.appendChild(suivicat_affichageVal(np));
lien_aff.appendChild(document.createTextNode(" - "));
lien_aff.appendChild(suivicat_affichageVal(-nm));
}
else
{
laCase.appendChild(document.createTextNode(" : . - ."));
}
}
}
function suivicat_miseAJourToutesLesDerS(valActu)
{
suivicat_initialiserLireVal();
var liste = suivicat_div_liste.getElementsByTagName("tr");
for(var i=0; i<suivicat_tableau.length; i++)
{
if( suivicat_tableau[i].cptOuDet && (valActu != 1 || suivicat_tableau[i].cptOuDet == "cpt") )
{
suivicat_miseAJourDerS_b(suivicat_tableau[i], valActu);
}
}
suivicat_finaliserEcrireVal()
}
function suivicat_miseAJourDerS(ligneTableau, valActu)
{
suivicat_initialiserLireVal();
suivicat_miseAJourDerS_b(ligneTableau, valActu);
suivicat_finaliserEcrireVal();
}
function suivicat_miseAJourDerS_b(ligneTableau, valActu)
{
var tab_tmp = ligneTableau.item.getElementsByTagName("span");
var nouv_texte = tab_tmp[tab_tmp.length-1];
if(!nouv_texte) return;
nouv_texte.style.color = "orange";
var suf="";
var debNom = "sc"+ligneTableau.nomCat;
if(valActu==0)
{
nouv_texte.innerHTML = "<small>"+suivicat_dateActu+"</small>";
}else if(valActu==1)
{
suf = "_pr";
nouv_texte.innerHTML = "<small>"+suivicat_datePred+"</small>";
}
else //valActu==2
{
nouv_texte.innerHTML = "<small><i>"+suivicat_tab_aff_sv[3]+"</i></small>";
}
if(ligneTableau.cptOuDet == "cpt")
{
if(valActu <= 1)
suivicat_ecrireVal(debNom+"cpt_ds", suivicat_concatNb(ligneTableau, suf));
else
suivicat_ecrireVal(debNom+"cpt_ds", null);
}
else
{
if(valActu == 0) // et pas valActu <= 1, car pas de sauvegarde pour pred (valActu = 1)
{
var texte_sv = "";
for(var i = 0; i<suivicat_tab_types.length; i++)
{
var tabMem = ligneTableau["tabMem"+suivicat_tab_types[i]];
if(tabMem.length == 0) texte_sv += "suivicat_vide|||";
else texte_sv += (tabMem.join("||") + '|||');
}
suivicat_ecrireVal(debNom+"det_ds", texte_sv+suivicat_dateActu);
}
else
{
suivicat_ecrireVal(debNom+"det_ds", null);
}
}
}
function suivicat_decrCompteur()
{
suivicat_compteur--;
if(suivicat_compteur == 0)
{
suivicat_finaliserEcrireVal();
var liste_titres = suivicat_div_liste.getElementsByTagName("th");
if(liste_titres.length < 2) return;
//lien sauvegarde actu
var lien = document.createElement("a");
lien.href = "javascript:;";
lien.onclick = function(){ suivicat_miseAJourToutesLesDerS(0);}
lien.innerHTML=suivicat_tab_aff_sv[0]+" : <small>"+suivicat_dateActu+"</small>";
liste_titres[1].appendChild(lien);
liste_titres[1].appendChild(document.createTextNode(" - "));
//lien sauvegarde pred
if(suivicat_datePred)
{
var lien_p = document.createElement("a");
lien_p.href = "javascript:;";
lien_p.onclick = function(){ suivicat_miseAJourToutesLesDerS(1);}
lien_p.innerHTML=suivicat_tab_aff_sv[1]+" : <small>"+suivicat_datePred+"</small>";
liste_titres[1].appendChild(lien_p);
}else
{
var pas_lien_b = document.createElement("small");
pas_lien_b.innerHTML = "<i>"+suivicat_tab_aff_sv[3]+"</i>";
liste_titres[1].appendChild(pas_lien_b);
}
liste_titres[1].appendChild(document.createTextNode(" - "));
//lien remise à zéro sauvegarde
var lien_raz = document.createElement("a");
lien_raz.href = "javascript:;";
lien_raz.onclick = function(){ suivicat_miseAJourToutesLesDerS(2);}
lien_raz.innerHTML=suivicat_tab_aff_sv[2];
liste_titres[1].appendChild(lien_raz);
}
}
function suivicat_afficherDiffMembres(ligneTableau, type)
{
var tableDiff = document.getElementById("suivicat_diff");
if(tableDiff) { tableDiff.parentNode.removeChild(tableDiff); }
caseTitre = document.createElement("th");
caseTitre.colSpan="2";
var ligneTitre = document.createElement("tr");
ligneTitre.appendChild(caseTitre);
listeP = document.createElement("ul");
var caseP = document.createElement("td");
caseP.appendChild(listeP);
listeM = document.createElement("ul");
var caseM = document.createElement("td");
caseM.appendChild(listeM);
var ligneDiff = document.createElement("tr");
ligneDiff.appendChild(caseP); ligneDiff.appendChild(caseM);
var tbody = document.createElement("tbody");
tbody.appendChild(ligneTitre);
tbody.appendChild(ligneDiff);
tableDiff = document.createElement("table");
tableDiff.id = "suivicat_diff";
tableDiff.className = "wikitable";
tableDiff.appendChild(tbody);
ligneTableau.item.appendChild(tableDiff);
var a = document.createElement("a");
a.href = "javascript:;";
a.onclick = function(){ tableDiff.parentNode.removeChild(tableDiff); }
a.innerHTML = "[–]";
var div_a = document.createElement("div");
if(suivicat_estIE) div_a.style.styleFloat= "right"; //IE
else div_a.style.cssFloat= "right"; //FF
div_a.appendChild(a);
caseTitre.appendChild(div_a);
caseTitre.appendChild(document.createTextNode(type+" "));
for(var t=0; t<suivicat_tab_types.length; t++)
{
if(type != "size" && type != suivicat_tab_types[t]) continue;
var tabPlus = ligneTableau["memEnPlus"+suivicat_tab_types[t]];
var tabMoins = ligneTableau["memEnMoins"+suivicat_tab_types[t]];
for(var i=0; i<tabPlus.length; i++)
{
var a = document.createElement("a");
a.href = "/wiki/"+tabPlus[i];
a.title = tabPlus[i];
a.innerHTML = tabPlus[i];
var li = document.createElement("li");
li.innerHTML = '<font style="color:green">+</span>';
li.appendChild(a);
listeP.appendChild(li);
}
for(var i=0; i<tabMoins.length; i++)
{
var a = document.createElement("a");
a.href = "/wiki/"+tabMoins[i];
a.title = tabMoins[i];
a.innerHTML = tabMoins[i];
var li = document.createElement("li");
li.innerHTML = '<font style="color:red">-</span>';
li.appendChild(a);
listeM.appendChild(li);
}
}
}
function suivicat_affLiensMaj(item, ligneTableau)
{
item.appendChild(document.createTextNode(" - "));
//date dernière sauvegarde
var texte_date_DerS = document.createElement("small");
if(ligneTableau.date_ds)
texte_date_DerS.innerHTML = "<span>"+ligneTableau.date_ds+"</span>";
else
texte_date_DerS.innerHTML = "<span><i>"+suivicat_tab_aff_sv[3]+"</i></span>";
item.appendChild(texte_date_DerS);
item.appendChild(document.createTextNode(" "));
//lien sauvegarde actu
var lien = document.createElement("a");
lien.href = "javascript:;";
lien.onclick = function(){ suivicat_miseAJourDerS(ligneTableau, 0);}
lien.innerHTML=suivicat_tab_aff_sv[0];
item.appendChild(lien);
item.appendChild(document.createTextNode(" "));
if(ligneTableau.cptOuDet == "cpt")
{
//lien sauvegarde pred
if(suivicat_datePred)
{
var lien_p = document.createElement("a");
lien_p.href = "javascript:;";
lien_p.onclick = function(){ suivicat_miseAJourDerS(ligneTableau, 1);}
lien_p.innerHTML=suivicat_tab_aff_sv[1];
item.appendChild(lien_p);
}else
{
var pas_lien_b = document.createElement("small");
pas_lien_b.innerHTML = "<i>"+suivicat_tab_aff_sv[3]+"</i>";
item.appendChild(pas_lien_b);
}
item.appendChild(document.createTextNode(" "));
}
//lien remise à zéro sauvegarde
var lien_raz = document.createElement("a");
lien_raz.href = "javascript:;";
lien_raz.onclick = function(){ suivicat_miseAJourDerS(ligneTableau, 2);}
lien_raz.innerHTML="<small>"+suivicat_tab_aff_sv[2]+"</small>";
item.appendChild(lien_raz);
}
function suivicat_nbPages(item, nomCat, mode_cpt)
{
var num = suivicat_tableau.length;
suivicat_tableau[num]=new Object();
var ligneTableau = suivicat_tableau[num];
if(mode_cpt) // on compte les pages, subcats, fichiers
{
var sc_http = new XMLHttpRequest() ;
sc_http.open('GET', mw.config.get('wgScriptPath') + "/api.php?action=query&list=allcategories&acfrom=" + nomCat + "&acprop=size&aclimit=1&format=json", true);
sc_http.onreadystatechange = function()
{
if(typeof sc_http == "undefined") return;
if (sc_http.readyState == 4)
{
ligneTableau.cptOuDet = "cpt";
ligneTableau.item = item;
ligneTableau.nomCat = nomCat;
var texte = eval('('+sc_http.responseText+')');
var texteb = texte.query.allcategories[0];
if(texteb)
{
ligneTableau.pages = texteb.pages;
ligneTableau.subcats = texteb.subcats;
ligneTableau.files = texteb.files;
ligneTableau.size = texteb.size;
}
//récupérer sauvegarde visite précédente
var nb = suivicat_lireVal("sc"+nomCat+"cpt_pr");
if(nb) { suivicat_deconcatNb(ligneTableau, "_pr", nb); }
suivicat_ecrireVal("sc"+nomCat+"cpt_pr", suivicat_concatNb(ligneTableau, ""));
//récupérer dernière sauvegarde
var nb = suivicat_lireVal("sc"+nomCat+"cpt_ds");
if(nb) { suivicat_deconcatNb(ligneTableau, "_ds", nb); }
for(var i=0; i<suivicat_tab_types.length; i++)
{ suivicat_majCase(item, ligneTableau, suivicat_tab_types[i]); }
suivicat_majCase(item, ligneTableau, "size");
suivicat_affLiensMaj(item, ligneTableau);
suivicat_decrCompteur();
}
};
sc_http.send(null);
}
else // on cherche les différences dans les membres des listes de pages, subcats, fichiers
{
var sc_http = new XMLHttpRequest() ;
var url = mw.config.get('wgScriptPath') + "/api.php?action=query&list=categorymembers&cmtitle=Category:"+nomCat+"&cmlimit=500&format=json";
sc_http.open('GET', url, true);
sc_http.onreadystatechange = function()
{
if(typeof sc_http == "undefined") return;
if (sc_http.readyState == 4)
{
var texte = eval('('+sc_http.responseText+')');
var liste = texte.query.categorymembers;
while(texte["query-continue"] != null)
{
var sc_http_cont = new XMLHttpRequest() ;
sc_http_cont.open('GET', url+"&cmcontinue="+texte["query-continue"].categorymembers.cmcontinue, false);
sc_http_cont.send(null);
texte = eval('('+sc_http_cont.responseText+')');
liste = liste.concat(texte.query.categorymembers);
}
ligneTableau.cptOuDet = "det";
ligneTableau.item = item;
ligneTableau.nomCat = nomCat;
ligneTableau.tabMempages = new Array();
ligneTableau.tabMemsubcats = new Array();
ligneTableau.tabMemfiles = new Array();
for(var i=0; i<liste.length; i++)
{
if(liste[i].ns == "14") ligneTableau.tabMemsubcats.push(liste[i].title);
else if(liste[i].ns == "6") ligneTableau.tabMemfiles.push(liste[i].title);
else ligneTableau.tabMempages.push(liste[i].title); // ns à 0 ou 10 (modèle), ou autres
}
ligneTableau.tabMempages.sort();
ligneTableau.tabMemsubcats.sort();
ligneTableau.tabMemfiles.sort();
var donnees_ds = suivicat_lireVal("sc"+nomCat+"det_ds");
if(donnees_ds)
{
var tab_ds = donnees_ds.split("|||");
for(var t=0; t<suivicat_tab_types.length; t++)
{
var v_type = suivicat_tab_types[t];
var ancTabMembres;
if(tab_ds[t] == "suivicat_vide") ancTabMembres = new Array();
else ancTabMembres = tab_ds[t].split("||");
var tabMembres = ligneTableau["tabMem"+v_type];
ligneTableau["memEnPlus"+v_type] = new Array();
ligneTableau["memEnMoins"+v_type] = new Array();
var i=0 ; var j=0;
while(i<tabMembres.length && j<ancTabMembres.length)
{
if(tabMembres[i] == ancTabMembres[j]) { i++; j++;}
else if(tabMembres[i] < ancTabMembres[j]) { ligneTableau["memEnPlus"+v_type].push(tabMembres[i] ); i++;}
else { ligneTableau["memEnMoins"+v_type].push(ancTabMembres[j]); j++;}
}
while(i<tabMembres.length)
{ligneTableau["memEnPlus"+v_type].push(tabMembres[i] ); i++;}
while(j<ancTabMembres.length)
{ligneTableau["memEnMoins"+v_type].push(ancTabMembres[j]); j++;}
}
ligneTableau.date_ds = tab_ds[3];
}
for(var t=0; t<suivicat_tab_types.length; t++)
{ suivicat_majCase(item, ligneTableau, suivicat_tab_types[t]); }
suivicat_majCase(item, ligneTableau, "size");
suivicat_affLiensMaj(item, ligneTableau);
suivicat_decrCompteur();
}
};
sc_http.send(null);
}
}
function suivicat_lancer()
{
suivicat_div_liste = document.getElementById("suivicat");
if(! suivicat_div_liste) return;
suivicat_estIE = (navigator.appName == "Microsoft Internet Explorer");
if(suivicat_estIE)
{
suivicat_div_sauveg_IE = document.createElement("div");
suivicat_div_sauveg_IE.style.display = "none";
suivicat_div_sauveg_IE.style.behavior = "url('#default#userData')"
suivicat_div_liste.appendChild(suivicat_div_sauveg_IE);
}
suivicat_tableau = new Array();
suivicat_initialiserLireVal();
suivicat_dateActu = new Date();
suivicat_dateActu = suivicat_dateActu.getDate()+"/"+(parseInt(suivicat_dateActu.getMonth())+1)+"/"+suivicat_dateActu.getFullYear()+" ("+suivicat_dateActu.getHours()+":"+suivicat_dateActu.getMinutes()+":"+suivicat_dateActu.getSeconds()+")";
suivicat_datePred = suivicat_lireVal("sc_datePred");
suivicat_ecrireVal("sc_datePred", suivicat_dateActu);
if(typeof categoryTreeLoadChildren == 'function') // est-ce que la fonction existe ?
{ // http://fr.wikipedia.org/w/extensions/CategoryTree/CategoryTree.js
var f_reg = /^function categoryTreeLoadChildren\(([^\)]*)\) {(.*)}$/;
var tab_f = f_reg.exec(categoryTreeLoadChildren.toString().replace(/\n/g, " ").replace(/div\); *}/, "div); };")); // le dernier replace est pour ajouter un ";" à la fin de retryLink.onclick=...
var code_f = tab_f[2].replace(/result;/, "result; suivicat_depliementCat(cat, div);");
categoryTreeLoadChildren = new Function (tab_f[1], code_f);
}
var liste = suivicat_div_liste.getElementsByTagName("tr");
var reg_cat = new RegExp("^.*/wiki/"+suivicat_cat+":");
suivicat_compteur = 1;
for(var i=0; i<liste.length; i++)
{
var t_l = liste[i].getElementsByTagName("td");
var ligne = t_l[1];
if(!ligne) {continue;}
var mode_cpt = (t_l[0].innerHTML == "");
for(var c=0; c<ligne.childNodes.length; c++)
{
var ch = ligne.childNodes[c];
if(ch.nodeName.toLowerCase()=="a" && reg_cat.test(ch.href))
{
suivicat_compteur++;
suivicat_nbPages(ligne, ch.href.replace(reg_cat, ""), mode_cpt);
break;
}else if(ch.className=="CategoryTreeTag" || ch.className==" CategoryTreeTag")
{
var tab = ch.getElementsByTagName("div");
for(var e=0; e<tab.length; e++)
if(tab[e].className == "CategoryTreeItem")
{
suivicat_compteur++;
suivicat_nbPages(tab[e], tab[e].childNodes[2].href.replace(reg_cat, ""), mode_cpt);
}
break;
}
}
}
suivicat_decrCompteur();
}
function suivicat_depliementCat(catPere, div)
{
var tab_d = div.getElementsByTagName("div");
var mode_cpt;
for(var e=0; e<suivicat_tableau.length; e++)
if(suivicat_tableau[e].nomCat == catPere) { mode_cpt = (suivicat_tableau[e].cptOuDet=="cpt"); break; }
var reg_cat = new RegExp("^.*/wiki/"+suivicat_cat+":");
for(var i =0; i<tab_d.length; i++)
if(tab_d[i].className == "CategoryTreeItem")
suivicat_nbPages(tab_d[i], tab_d[i].childNodes[1].href.replace(reg_cat, ""), mode_cpt);
}
$(function()
{
if(mw.config.get('wgTitle').toLowerCase().match("/suivicat") && mw.config.get('wgAction')=="view") suivicat_lancer();
});